/**
 * database.js - 数据库配置
 * 
 * 这个模块配置Sequelize ORM连接到MySQL数据库。
 * 它使用环境变量来获取数据库连接信息，并导出一个Sequelize实例。
 */

const { Sequelize } = require('sequelize');
const config = require('./index');
const logger = require('../utils/logger');

/**
 * 创建Sequelize实例
 * 
 * 使用环境变量中的数据库配置信息初始化Sequelize
 */
const sequelize = new Sequelize(
  'api', // 数据库名
  'admin', // 用户名
  '123456', // 密码
  {
    host: 'localhost', // 数据库主机
    port: 3306, // 数据库端口
    dialect: 'mysql', // 数据库类型
    logging: (msg) => logger.debug(msg), // 使用自定义logger记录SQL查询
    pool: {
      max: 10, // 连接池最大连接数
      min: 0, // 连接池最小连接数
      acquire: 30000, // 获取连接的最大等待时间（毫秒）
      idle: 10000, // 连接在被释放之前可以空闲的最长时间（毫秒）
    },
    define: {
      timestamps: true, // 自动添加createdAt和updatedAt字段
      underscored: true, // 使用下划线命名法（例如：created_at而不是createdAt）
      freezeTableName: false, // 不冻结表名，允许Sequelize自动复数化表名
      charset: 'utf8mb4', // 使用utf8mb4字符集以支持完整的Unicode字符集（包括表情符号）
      collate: 'utf8mb4_unicode_ci', // 使用Unicode排序规则
    },
    dialectOptions: {
      dateStrings: true, // 将日期作为字符串返回
      typeCast: true, // 启用类型转换
    },
    timezone: '+08:00', // 设置时区为中国标准时间
  }
);

/**
 * 测试数据库连接
 * 
 * 在应用启动时验证数据库连接是否成功
 */
const testConnection = async () => {
  try {
    await sequelize.authenticate();
    logger.info('数据库连接已成功建立');
    return true;
  } catch (error) {
    logger.error('无法连接到数据库:', error);
    return false;
  }
};

module.exports = {
  sequelize,
  testConnection,
};